package io.gitee.kotle.android.utils

import com.google.gson.reflect.TypeToken
import io.gitee.kotle.android.BaseGlobalConst.gson
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type


/**
 * 对象转为json格式字符串
 */
fun Any.toJsonString(): String {
    if (this is String) {
        return this
    }
    return gson.toJson(this)
}

/**
 * json格式字符串，转对象
 */
inline fun <reified T> String.formJsonString(customType: GsonParameterizedType<T>? = null): T {
    if (T::class.java == String::class.java) {
        return this as T
    }
    return gson.fromJson(this, customType ?: object : TypeToken<T>() {}.type)
}

/**
 * 传入实际的泛型类型
 */
inline fun <reified T> createGsonParameterizedType(
    crossinline ownerType: (() -> Type?) = { null },
    crossinline actualTypeArguments: () -> Array<Type>,/*返回T类上的泛型，具体类型*/
): GsonParameterizedType<T> {
    return object : GsonParameterizedType<T>() {
        override fun getActualTypeArguments(): Array<Type> {
            return actualTypeArguments.invoke()
        }

        override fun getRawType(): Type {
            return T::class.java
        }

        override fun getOwnerType(): Type? {
            return ownerType.invoke()
        }
    }
}

/**
 * 这里泛型只做约束使用
 */
abstract class GsonParameterizedType<T> : ParameterizedType